package com.hejia.alauda.service;

import java.util.Date;
import java.util.List;

import com.hejia.alauda.entity.Presell;
import com.hejia.alauda.entity.Product;
import com.hejia.alauda.entity.Product.Category;
import com.hejia.alauda.entity.example.PresellExample;
import com.hejia.alauda.exception.BusinessException;
import com.hejia.alauda.utils.Pager;

public interface PresellService {

	/**
	 * 查找所有排期预售
	 * 
	 * @param pager
	 * @return
	 */

	public Pager<Presell> findAllPresell(Pager<Presell> pager);

	/**
	 * 查找所有排期预售
	 * 
	 * @param pager
	 * @return
	 */
	public Pager<Presell> findAllPresell(Pager<Presell> pager,
			PresellExample example);

	/**
	 * 保存排期预售
	 * 
	 * @param type
	 * @return
	 */
	public boolean savePresell(Presell presell);

	/**
	 * 根据ID获取排期预售
	 * 
	 * @param type
	 * @return
	 */
	public Presell getPresellById(Long id);

	/**
	 * 修改排期预售
	 * 
	 * @param user
	 * @return
	 */
	public boolean modifyPresell(Presell presell);

	/**
	 * 根据ID删除版本信息
	 * 
	 * @param type
	 * @return
	 */
	public boolean deletePresell(Long id);

	/**
	 * 获取需要上架的排期预售
	 * 
	 * @return
	 */
	public Presell getLastPresell(Product.Category category);

	/**
	 * 获取最新的排期预售
	 * @param category 产品类别
	 * @return
	 */
	public Presell findLastPresell(Product.Category category);

	/**
	 * 上架新手排期预售
	 * @throws BusinessException 
	 */
	public void publicRookiePresell() throws BusinessException;

	/**
	 * 查询最新的排期预售
	 * @return
	 */
	public Presell findLastPresell(Product.Category category, boolean rookie);

	/**
	 * 查询未发布排期预售
	 * @param financialAssetId 金融资产ID
	 * @return 未发布排期预售
	 */
	public List<Presell> findNotPublicPresellsByFinancialAssetId(Long financialAssetId);

	/**
	 * 上架排期预售
	 * @param category 产品类别
	 * @throws BusinessException 
	 */
	public void publicPresell(Category category) throws BusinessException;

	/**
	 * 调整产品期限避开节假日兑付
	 * @param startTime	起售时间
	 * @param endTime	截止销售日期
	 * @param term	期限
	 * @param maxAdjustDays	最大调整天数
	 * @return 调整后的产品期限
	 */
	public int adjustTermAvoidHolidayRepay(Date startTime, Date endTime, int term, int maxAdjustDays);

}
